001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Nov 28, 2002 005 * Time: 2:37:43 AM 006 */ 007 008 package EVolve.visualization.XYViz.ValRefViz.HotSpotViz; 009 010 import EVolve.util.painters.StackHotspotPainter; 011 import EVolve.util.ThreadChooser; 012 import EVolve.data.Element; 013 import EVolve.visualization.AutoImage; 014 import EVolve.visualization.Dimension; 015 import EVolve.visualization.ValueDimension; 016 import EVolve.visualization.ReferenceDimension; 017 018 import javax.swing.*; 019 import java.util.*; 020 import java.awt.event.*; 021 022 public class StackHotspotViz extends HotSpotVisualization{ 023 private ArrayList menuList; 024 private String dataFilterName[]; 025 private JMenuItem itemChangThread; 026 private HashMap methodStacks; 027 private ThreadChooser td; 028 private Stack stack; 029 030 public StackHotspotViz() { 031 super(); 032 dataFilterName = new String[2]; 033 034 dataFilterName[0] = "Bytecode"; 035 dataFilterName[1] = "Method"; 036 037 menuList = new ArrayList(); 038 td = new ThreadChooser(imageMap,false); 039 painters[0] = new StackHotspotPainter(); 040 painters[1] = painters[0]; 041 } 042 043 public Dimension[] createDimension() { 044 Dimension [] returnDimension = new Dimension[3]; 045 046 xAxis = new ValueDimension(); 047 yAxis = new ReferenceDimension(); 048 zAxis = new ReferenceDimension(); 049 050 returnDimension[0] = xAxis; 051 returnDimension[1] = yAxis; 052 returnDimension[2] = zAxis; 053 054 return returnDimension; 055 } 056 057 protected JPanel createConfigurationPanel() { 058 JPanel returnVal = super.createConfigurationPanel(); 059 060 comboPainter.removeItemAt(1); 061 062 return returnVal; 063 } 064 065 protected ArrayList createOptionalMenu() { 066 if (menuList.size() > 0) return null; 067 068 menuList.clear(); 069 itemChangThread = new JMenuItem("Switch thread..."); 070 itemChangThread.setMnemonic(KeyEvent.VK_T); 071 itemChangThread.addActionListener(new ActionListener() { 072 public void actionPerformed(ActionEvent e) { 073 visualize(); 074 } 075 }); 076 077 menuList.add(itemChangThread); 078 return menuList; 079 } 080 081 public void preVisualize() { 082 super.preVisualize(); 083 image = null; 084 methodStacks = new HashMap(); 085 } 086 087 public void receiveElement(Element element) { 088 long threadId = zAxis.getField(element); 089 090 switchThread(threadId); 091 long x = xAxis.getField(element); 092 long y = yAxis.getField(element); 093 long z = element.isOptional() ? Integer.MAX_VALUE : Integer.MIN_VALUE; 094 095 phaseDetector.collectData(x/interval,y); 096 ((StackHotspotPainter)painter).setStack(stack); 097 paint(x,y,z); 098 } 099 100 public void visualize() { 101 String selected = null; 102 if (imageMap.size() == 0 ) return; 103 while (selected==null) { 104 selected = td.showDialog(); 105 if (selected != null) { 106 image = (AutoImage)imageMap.get(new Long(selected.substring(7,selected.length()))); 107 sort(); 108 selected = null; 109 break; 110 } 111 } 112 113 } 114 115 protected void switchThread(long threadId) { 116 if (currentThread != threadId) { 117 stack = (Stack)methodStacks.get(new Long(threadId)); 118 if (stack == null) { 119 stack = new Stack(); 120 methodStacks.put(new Long(threadId),stack); 121 } 122 super.switchThread(threadId); 123 } 124 } 125 126 public Object clone() { 127 StackHotspotViz o = (StackHotspotViz)super.clone(); 128 o.createOptionalMenu(); 129 o.dataFilterName = new String[dataFilterName.length]; 130 for (int i=0; i<dataFilterName.length; i++) 131 o.dataFilterName[i] = dataFilterName[i]; 132 if (methodStacks == null) { 133 o.methodStacks = (HashMap)methodStacks.clone(); 134 Iterator it = methodStacks.keySet().iterator(); 135 while(it.hasNext()) { 136 Object key = it.next(); 137 o.methodStacks.put(key, methodStacks.get(key)); 138 } 139 } 140 o.td = new ThreadChooser(o.imageMap,false); 141 o.stack = (Stack)stack.clone(); 142 o.menuList.clear(); 143 return o; 144 } 145 }